#include "../head.h"

// extern char **environ;
// 进程替换 pathname表示文件路径 file 文件名 *arg表示需要传递的参数列表
// envp环境变量字符串数组 使新程序只有设置环境变量而没有之前的环境变量
// int execl(const char *pathname, const char *arg, ... /* (char  *) NULL */);
// int execlp(const char *file, const char *arg, .../* (char  *) NULL */);
// int execle(const char *pathname, const char *arg, ... /*, (char *) NULL, char *const envp[] */);
// int execv(const char *pathname, char *const argv[]);
// int execvp(const char *file, char *const argv[]);
// int execvpe(const char *file, char *const argv[],char *const envp[]);

int main()
{
    printf("main\n");

    pid_t pid = vfork();
    if (pid == 0)
    {
        printf("child\n");
        // execl("./hello", "11", "22", NULL);// 子进程被替换成了hello 进程 携带参数 11 22
        // execlp("ls", "-l", NULL); // 执行ls -l 的命令 在path环境变量中寻找符合要求的可执行文件或命令 file中有路径则与execl一样
        printf("======================================================\n");
        // system("env");
        printf("======================================================\n");
        char *fake_home_env[] = {
            "USER=testuser",
            "HOME=/tmp/test_home",
            "PATH=/bin",
            NULL};
        // execle("./hello", "bash", NULL, fake_home_env); // 执行execle后，子进程的环境变量被替换成fake_home_env
        // execle("/usr/bin/env", "env", NULL, fake_home_env);//查看环境变量
        char *arr[] = {"11","22", NULL};
        execv("./hello", arr); // 参数列表被替换成arr
    }
    if (pid > 0)
    {
        sleep(3);
        printf("parent\n");
    }

    return 0;
}